{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import pandas as pd\n",
    "import matplotlib.pyplot as plt\n",
    "from sklearn.linear_model import LinearRegression\n",
    "import gc"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "# load all the data\n",
    "df_train = pd.read_csv('../Resources/weather_train.csv')\n",
    "df_train[\"timestamp\"] = pd.to_datetime(df_train[\"timestamp\"], format='%Y-%m-%d %H:%M:%S')\n",
    "df_test = pd.read_csv(\"../Resources/weather_test.csv\")\n",
    "df_test[\"timestamp\"] = pd.to_datetime(df_test[\"timestamp\"], format='%Y-%m-%d %H:%M:%S')\n",
    "df_filled = pd.read_csv('../Large_output/csv/filled_initial.csv')\n",
    "df_filled[\"time\"] = pd.to_datetime(df_filled[\"time\"], format='%Y-%m-%d %H:%M:%S')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "# load the data from outside we can get\n",
    "fill_weather = pd.read_csv('../Resources/extra_weather_data/more_weather_locations.csv', index_col=0, \n",
    "                           parse_dates=True, infer_datetime_format=True)\\\n",
    "                .join(pd.read_csv('../Resources/extra_weather_data/temperature.csv', index_col=0, parse_dates=True,\n",
    "                                  infer_datetime_format=True,).sub(273),how='left')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [],
   "source": [
    "# merge and get the pivot data\n",
    "weath = pd.concat([df_train, df_test]).set_index(['site_id', 'timestamp'])\n",
    "weath = weath.reindex(pd.MultiIndex.from_product(\n",
    "    [range(16), pd.date_range('2016-01-01', '2018-12-31 23:00', freq='H')]))\n",
    "weath = weath.unstack(level=0).interpolate(limit=2).ffill(limit=1).bfill(limit=1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>location</th>\n",
       "      <th>corr</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>site_id</th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>orlando</td>\n",
       "      <td>0.971346</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>heathrow</td>\n",
       "      <td>0.985568</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>Phoenix</td>\n",
       "      <td>0.978950</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>washington</td>\n",
       "      <td>0.990834</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>San Francisco</td>\n",
       "      <td>0.927506</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>birmingham</td>\n",
       "      <td>0.944360</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6</th>\n",
       "      <td>washington</td>\n",
       "      <td>0.976488</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>7</th>\n",
       "      <td>ottowa</td>\n",
       "      <td>0.990955</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>8</th>\n",
       "      <td>orlando</td>\n",
       "      <td>0.971346</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>9</th>\n",
       "      <td>sanantonio</td>\n",
       "      <td>0.978205</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>10</th>\n",
       "      <td>saltlake</td>\n",
       "      <td>0.974286</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>11</th>\n",
       "      <td>ottowa</td>\n",
       "      <td>0.990955</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>12</th>\n",
       "      <td>dublin</td>\n",
       "      <td>0.954968</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>13</th>\n",
       "      <td>Minneapolis</td>\n",
       "      <td>0.994499</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>14</th>\n",
       "      <td>Philadelphia</td>\n",
       "      <td>0.993035</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>15</th>\n",
       "      <td>rochester</td>\n",
       "      <td>0.975049</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "              location      corr\n",
       "site_id                         \n",
       "0              orlando  0.971346\n",
       "1             heathrow  0.985568\n",
       "2              Phoenix  0.978950\n",
       "3           washington  0.990834\n",
       "4        San Francisco  0.927506\n",
       "5           birmingham  0.944360\n",
       "6           washington  0.976488\n",
       "7               ottowa  0.990955\n",
       "8              orlando  0.971346\n",
       "9           sanantonio  0.978205\n",
       "10            saltlake  0.974286\n",
       "11              ottowa  0.990955\n",
       "12              dublin  0.954968\n",
       "13         Minneapolis  0.994499\n",
       "14        Philadelphia  0.993035\n",
       "15           rochester  0.975049"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# find the corrolation by air_temperature\n",
    "# reason of not 100% fitting is that they are just super nearby \n",
    "# instead of same position or have the missing filling\n",
    "weath_corr = fill_weather.join(weath['air_temperature']).corr().drop(range(16)).loc[:, range(16)]\n",
    "\n",
    "site_id_loc_corr = pd.concat([weath_corr.idxmax(), weath_corr.max()], \n",
    "                             keys=['location', 'corr'], axis=1).rename_axis('site_id')\n",
    "site_id_loc_corr"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/local/home/ningzesun/.local/lib/python3.6/site-packages/pandas/plotting/_matplotlib/converter.py:103: FutureWarning: Using an implicitly registered datetime converter for a matplotlib plotting method. The converter was registered by pandas on import. Future versions of pandas will require you to explicitly register matplotlib converters.\n",
      "\n",
      "To register the converters:\n",
      "\t>>> from pandas.plotting import register_matplotlib_converters\n",
      "\t>>> register_matplotlib_converters()\n",
      "  warnings.warn(msg, FutureWarning)\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "# showing orlando where is EST temperature peak is 19 around suggesting it is UTC time\n",
    "df_orlando = df_train.loc[df_train['site_id'] == 0,:]\n",
    "df_orlando = df_orlando[['timestamp', 'air_temperature']]\n",
    "df_orlando_merge = df_orlando.merge(fill_weather['orlando'], on = 'timestamp', how = 'left')\n",
    "df_orlando_merge = df_orlando_merge.set_index('timestamp')\n",
    "data = df_orlando_merge.loc['2016-08-01': '2016-08-01']\n",
    "plt.plot(data['air_temperature'])\n",
    "plt.plot(data['orlando'])\n",
    "plt.xticks(rotation=90)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "# heathrow is UTC time showing temperature peak is arount 2\n",
    "df_heathrow = df_train.loc[df_train['site_id'] == 1,:]\n",
    "df_heathrow = df_heathrow[['timestamp', 'air_temperature']]\n",
    "df_heathrow_merge = df_heathrow.merge(fill_weather['heathrow'], on = 'timestamp', how = 'left')\n",
    "df_heathrow_merge = df_heathrow_merge.set_index('timestamp')\n",
    "data = df_heathrow_merge.loc['2016-08-01': '2016-08-01']\n",
    "plt.plot(data['air_temperature'])\n",
    "plt.plot(data['heathrow'])\n",
    "plt.xticks(rotation=90)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [],
   "source": [
    "# get the dictionary for the site_id to city name\n",
    "site_dict  = {}\n",
    "for loc_name, loc_S in fill_weather.iteritems():\n",
    "    site_scores = []\n",
    "    for site_id, site_S in weath.air_temperature.iteritems():\n",
    "        df = loc_S.to_frame(loc_name).join(site_S)\n",
    "        site_scores.append(df.diff(axis=1).pow(2).mean().pow(0.5).iat[1])\n",
    "    site_dict[loc_name] = site_scores\n",
    "temp_rmse = pd.DataFrame(site_dict, index=range(16))\n",
    "temp_rmse = temp_rmse.drop('San Antonio', axis=1)\n",
    "site_loc_rmse = pd.concat([temp_rmse.idxmin(axis=1), temp_rmse.min(axis=1)], keys=['location', 'RMSE'], axis=1).rename_axis('site_id')\n",
    "site_name = site_loc_rmse.location.to_dict()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [],
   "source": [
    "# resite the location based on correction\n",
    "site_temp = {'orlando': 0, 'heathrow': 1, 'Phoenix': 2, 'washington': 3, 'sanfranitl': 4,\n",
    "             'birmingham': 5, 'ottowa': 6, 'sanantonio': 7, 'saltlake': 8, 'dublin': 9,\n",
    "             'Minneapolis': 10, 'Philadelphia': 11, 'rochester': 12,}\n",
    "site_cor = {}\n",
    "for i in site_name.keys():\n",
    "    site_cor[i] = site_temp[site_name[i]]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [],
   "source": [
    "# check the correlation of weather csv and collected data from darkweather api\n",
    "site_real_cor = {}\n",
    "weather_list = {'air_temperature': 'apparentTemperature', 'cloud_coverage': 'cloudCover', \n",
    "                'dew_temperature': 'dewPoint', 'precip_depth_1_hr': 'precipIntensity'}\n",
    "\n",
    "for j in weather_list.keys():\n",
    "    temp_cor = {}\n",
    "    pivot_weather = df_correct.pivot(index = 'time', columns = 'site_id', values = weather_list[j])\n",
    "    pivot_real = pd.concat([df_train, df_test]).pivot(index = 'timestamp', columns = 'site_id', \n",
    "                                                      values = j)\n",
    "    for i in site_cor.keys():\n",
    "        weather_corr = pd.concat([pivot_weather[site_cor[i]], pivot_real[i]], axis = 1).corr().reset_index()\n",
    "        weather_corr.columns = [0,1,2]\n",
    "        temp_cor[i] = weather_corr[2][0]\n",
    "    site_real_cor[j] = temp_cor"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>air_temperature</th>\n",
       "      <th>cloud_coverage</th>\n",
       "      <th>dew_temperature</th>\n",
       "      <th>precip_depth_1_hr</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>0.975828</td>\n",
       "      <td>0.648649</td>\n",
       "      <td>0.988543</td>\n",
       "      <td>0.478750</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>0.991228</td>\n",
       "      <td>0.294096</td>\n",
       "      <td>0.986224</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>0.990138</td>\n",
       "      <td>0.689029</td>\n",
       "      <td>0.983118</td>\n",
       "      <td>0.300045</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>0.990203</td>\n",
       "      <td>0.782995</td>\n",
       "      <td>0.994323</td>\n",
       "      <td>0.580863</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>0.938549</td>\n",
       "      <td>0.541697</td>\n",
       "      <td>0.914351</td>\n",
       "      <td>0.746662</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>0.939236</td>\n",
       "      <td>0.228580</td>\n",
       "      <td>0.942338</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6</th>\n",
       "      <td>0.977308</td>\n",
       "      <td>0.405792</td>\n",
       "      <td>0.981641</td>\n",
       "      <td>0.190722</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>7</th>\n",
       "      <td>0.992480</td>\n",
       "      <td>NaN</td>\n",
       "      <td>0.997667</td>\n",
       "      <td>0.536967</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>8</th>\n",
       "      <td>0.975828</td>\n",
       "      <td>0.648649</td>\n",
       "      <td>0.988543</td>\n",
       "      <td>0.478750</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>9</th>\n",
       "      <td>0.979778</td>\n",
       "      <td>0.447240</td>\n",
       "      <td>0.981883</td>\n",
       "      <td>0.299041</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>10</th>\n",
       "      <td>0.988169</td>\n",
       "      <td>0.531088</td>\n",
       "      <td>0.955472</td>\n",
       "      <td>0.531596</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>11</th>\n",
       "      <td>0.992480</td>\n",
       "      <td>NaN</td>\n",
       "      <td>0.997667</td>\n",
       "      <td>0.536967</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>12</th>\n",
       "      <td>0.975190</td>\n",
       "      <td>0.859839</td>\n",
       "      <td>0.989269</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>13</th>\n",
       "      <td>0.994150</td>\n",
       "      <td>0.804853</td>\n",
       "      <td>0.996002</td>\n",
       "      <td>0.650996</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>14</th>\n",
       "      <td>0.991105</td>\n",
       "      <td>0.651438</td>\n",
       "      <td>0.994854</td>\n",
       "      <td>0.540257</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>15</th>\n",
       "      <td>0.971126</td>\n",
       "      <td>0.292466</td>\n",
       "      <td>0.978422</td>\n",
       "      <td>0.260844</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "    air_temperature  cloud_coverage  dew_temperature  precip_depth_1_hr\n",
       "0          0.975828        0.648649         0.988543           0.478750\n",
       "1          0.991228        0.294096         0.986224                NaN\n",
       "2          0.990138        0.689029         0.983118           0.300045\n",
       "3          0.990203        0.782995         0.994323           0.580863\n",
       "4          0.938549        0.541697         0.914351           0.746662\n",
       "5          0.939236        0.228580         0.942338                NaN\n",
       "6          0.977308        0.405792         0.981641           0.190722\n",
       "7          0.992480             NaN         0.997667           0.536967\n",
       "8          0.975828        0.648649         0.988543           0.478750\n",
       "9          0.979778        0.447240         0.981883           0.299041\n",
       "10         0.988169        0.531088         0.955472           0.531596\n",
       "11         0.992480             NaN         0.997667           0.536967\n",
       "12         0.975190        0.859839         0.989269                NaN\n",
       "13         0.994150        0.804853         0.996002           0.650996\n",
       "14         0.991105        0.651438         0.994854           0.540257\n",
       "15         0.971126        0.292466         0.978422           0.260844"
      ]
     },
     "execution_count": 12,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "pd.DataFrame.from_dict(site_real_cor)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "# heathrow is UTC time showing temperature peak is arount 2\n",
    "df_heathrow = df_train.loc[df_train['site_id'] == 1,:]\n",
    "df_heathrow = df_heathrow[['timestamp', 'dew_temperature']]\n",
    "df_heathrow_merge = pd.merge(df_heathrow, df_filled.loc[df_filled['site_id'] == 1,['dewPoint', 'time']],\n",
    "                              right_on = 'time', left_on = 'timestamp', how = 'left')\n",
    "df_heathrow_merge = df_heathrow_merge.set_index('timestamp')\n",
    "data = df_heathrow_merge.loc['2016-08-01': '2016-08-01']\n",
    "plt.plot(data['dew_temperature'], color = 'orange')\n",
    "plt.plot(data['dewPoint'], color = 'red')\n",
    "plt.xticks(rotation=90)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [],
   "source": [
    "# find the regression of dew_temperature and the filled\n",
    "j = 'dew_temperature'\n",
    "slope = []\n",
    "intercept = []\n",
    "pivot_weather = df_correct.pivot(index = 'time', columns = 'site_id', values = weather_list[j])\n",
    "pivot_real = pd.concat([df_train, df_test]).pivot(index = 'timestamp', columns = 'site_id', values = j)\n",
    "for i in site_cor.keys():\n",
    "    dew_model = LinearRegression()\n",
    "    weather_corr = pd.concat([pivot_weather[site_cor[i]], pivot_real[i]], axis = 1).dropna()\n",
    "    weather_corr.columns = ['x', 'y']\n",
    "    x = np.array(weather_corr['x']).reshape(-1, 1)\n",
    "    y = np.array(weather_corr['y']).reshape(-1, 1)\n",
    "    dew_model.fit(x, y)\n",
    "    temp = dew_model.coef_\n",
    "    slope.append(list(dew_model.coef_[0])[0])\n",
    "    temp = dew_model.intercept_\n",
    "    intercept.append(list(temp)[0])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [],
   "source": [
    "# fill in the air temperature, cloud coverage and description in test weather csv\n",
    "df_test['description'] = ''\n",
    "for i in df_test.index:\n",
    "    site_id = df_test['site_id'][i]\n",
    "    time_stamp = df_test['timestamp'][i]\n",
    "    if pd.isnull(df_test['air_temperature'][i]):\n",
    "        site_id = df_test['site_id'][i]\n",
    "        time_stamp = df_test['timestamp'][i]\n",
    "        df_test['air_temperature'][i] = fill_weather[site_name[site_id]][time_stamp]\n",
    "    if pd.isnull(df_test['cloud_coverage'][i]):\n",
    "        try:\n",
    "            df_test['cloud_coverage'][i] = df_filled.loc[df_filled['site_id'] == site_cor[df_test['site_id'][i]], 'cloudCover']\\\n",
    "            .loc[df_filled['time'] == df_test['timestamp'][i]].values[0] * 10\n",
    "        except:\n",
    "            df_test['cloud_coverage'][i] = np.nan\n",
    "    try:\n",
    "        df_test['description'][i] = df_filled.loc[df_filled['site_id'] == site_cor[df_test['site_id'][i]], 'icon']\\\n",
    "        .loc[df_filled['time'] == df_test['timestamp'][i]].values[0]\n",
    "    except:\n",
    "        df_test['description'][i] = np.nan"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [],
   "source": [
    "# fill in the air temperature, cloud coverage and description in train weather csv\n",
    "df_train['description'] = ''\n",
    "for i in df_train.index:\n",
    "    site_id = df_train['site_id'][i]\n",
    "    time_stamp = df_train['timestamp'][i]\n",
    "    if pd.isnull(df_train['air_temperature'][i]):\n",
    "        site_id = df_train['site_id'][i]\n",
    "        time_stamp = df_train['timestamp'][i]\n",
    "        df_train['air_temperature'][i] = fill_weather[site_name[site_id]][time_stamp]\n",
    "    if pd.isnull(df_train['cloud_coverage'][i]):\n",
    "        try:\n",
    "            df_train['cloud_coverage'][i] = df_filled.loc[df_filled['site_id'] == site_cor[df_train['site_id'][i]], 'cloudCover']\\\n",
    "            .loc[df_filled['time'] == df_train['timestamp'][i]].values[0] * 10\n",
    "        except:\n",
    "            df_train['cloud_coverage'][i] = np.nan\n",
    "    try:\n",
    "        df_train['description'][i] = df_filled.loc[df_filled['site_id'] == site_cor[df_train['site_id'][i]], 'icon']\\\n",
    "        .loc[df_filled['time'] == df_train['timestamp'][i]].values[0]\n",
    "    except:\n",
    "        df_train['description'][i] = np.nan"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [],
   "source": [
    "# fill the dew_temperature\n",
    "df_list = [df_train_filled, df_test_filled]\n",
    "for j in df_list:\n",
    "    for i in j.index:\n",
    "        site_id = j['site_id'][i]\n",
    "        time_stamp = j['timestamp'][i]\n",
    "        if pd.isnull(j['dew_temperature'][i]):\n",
    "            try:\n",
    "                j['dew_temperature'][i] = df_filled.loc[df_filled['site_id'] == site_cor[j['site_id'][i]], 'dewPoint']\\\n",
    "                .loc[df_filled['time'] == j['timestamp'][i]].values[0] * slope[site_id] + intercept[site_id]\n",
    "            except:\n",
    "                j['dew_temperature'][i] = np.nan"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {},
   "outputs": [],
   "source": [
    "df_test_filled.to_csv('../../../Large_output/csv/fill_test_weather.csv')\n",
    "df_train_filled.to_csv('../../../Large_output/csv/fill_train_weather.csv')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "7603"
      ]
     },
     "execution_count": 19,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "del df_heathrow, df_heathrow_merge, site_loc_rmse, df_orlando_merge, df_orlando, df_filled, df_test\n",
    "gc.collect()"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.4"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 1
}
